package managedbeans;

import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;

import businedelegate.BusineDelegatePalc;
import entities.vo.FacturaVO;
import entities.vo.ItemFacturaVO;

public class ManagedBeanVentaArticulo {

	
	private FacturaVO				factura;
	private Integer					articuloReferencia;
	private ItemFacturaVO 			articuloSeleccionado;
	private BusineDelegatePalc		busineDelegate;
	private Integer					minimum;
	private Integer					maximum;
	private String					tipoFactura; 
	
	
	private String					messagesAgregarArticulo;
	private String					messagescantidadArticulo;
	private Boolean 				responsableInscripto;
	private Boolean 				excento;
	private Boolean 				noResponsable;
	private Boolean 				consumidorFinal;
	
	private Boolean 				contado;
	private Boolean 				ctacte;
	
	private Double					subtotal;
	private Double					iva;
	private Double					total;
	
	private SelectItem[] availableTipoFacturas= {
            new SelectItem("A"), new SelectItem("B"),
            new SelectItem("C")};
	public SelectItem[] getContadoValues() {  
		return new SelectItem[] {   
				new SelectItem("Contado", "Contado"),  
				new SelectItem("CtaCte", "Cta.Cte.")   
		   	};  
	}  

	
	public ManagedBeanVentaArticulo() {
		busineDelegate = BusineDelegatePalc.getInstance(); 
		minimum = 0;
		tipoFactura = "A";
		maximum = 9999999;
		messagesAgregarArticulo = "";
		factura = new FacturaVO();
		factura.setNroFactura( getBusineDelegate().getNroFactura());
		factura.setFecha(getBusineDelegate().getFecha());
		total=0D;
		subtotal=0D;
		iva=0D;
		
		messagescantidadArticulo = "";
	}
	
	public SelectItem[] getAvailableTipoFacturas() {
		return availableTipoFacturas;
	}
	public void setAvailableTipoFacturas(SelectItem[] availableTipoFacturas) {
		this.availableTipoFacturas = availableTipoFacturas;
	}
	public Boolean getResponsableInscripto() {
		return responsableInscripto;
	}


	public void setResponsableInscripto(Boolean responsableInscripto) {
		this.responsableInscripto = responsableInscripto;
	}


	public Boolean getExcento() {
		return excento;
	}


	public void setExcento(Boolean excento) {
		this.excento = excento;
	}


	public Boolean getNoResponsable() {
		return noResponsable;
	}


	public void setNoResponsable(Boolean noResponsable) {
		this.noResponsable = noResponsable;
	}


	public Boolean getConsumidorFinal() {
		return consumidorFinal;
	}


	public void setConsumidorFinal(Boolean consumidorFinal) {
		this.consumidorFinal = consumidorFinal;
	}


	public Boolean getCtacte() {
		return ctacte;
	}


	public void setCtacte(Boolean ctacte) {
		this.ctacte = ctacte;
	}


	public Double getSubtotal() {
		return subtotal;
	}


	public void setSubtotal(Double subtotal) {
		this.subtotal = subtotal;
	}


	public Double getIva() {
		return iva;
	}


	public void setIva(Double iva) {
		this.iva = iva;
	}


	public Double getTotal() {
		return total;
	}


	public void setTotal(Double total) {
		this.total = total;
	}


	public void setArticuloSeleccionado(ItemFacturaVO articuloSeleccionado) {
		factura.getItems().remove(articuloSeleccionado);
	}


	public Boolean getContado() {
		return contado;
	}
	public void setContado(Boolean contado) {
		this.contado = contado;
	}
	public Integer getMaximum() {
		return maximum;
	}
	public Integer getMinimum() {
		return minimum;
	}
	public void setMinimum(Integer minimum) {
		this.minimum = minimum;
	}
	public void setMaximum(Integer maximum) {
		this.maximum = maximum;
	}
	public void eliminarArticulo(){
		factura.getItems().remove(articuloSeleccionado);
	}
	public void selectPrecioOferta(ValueChangeEvent event){
		Integer referencia =Integer.valueOf(event.getComponent().getAttributes().get("label").toString());
		for (ItemFacturaVO item : factura.getItems()) {
			if(item.getArticulo().getReferencia().equals(referencia)){
				if(((Boolean)event.getNewValue())){
					item.setPrecioCobrado(item.getArticulo().getPrecioOferta());
					item.setOferta(true);
				}else{
					item.setPrecioCobrado(item.getArticulo().getPrecioUnitario());
					item.setOferta(false);
				}
				break;
			}
		}
		calculateTotal();
	}
	public void changeTipoFactura(ValueChangeEvent event){
		System.out.println("Cambiando tipo de factura");
		tipoFactura ="A";
		if(event.getNewValue()!= null){
			tipoFactura = event.getNewValue().toString();
		}
		System.out.println("Tipo de factura : "+tipoFactura);
		calculateTotal();
	}
	public void submitButtonClicked(ValueChangeEvent event){
		Integer referencia =Integer.valueOf(event.getComponent().getAttributes().get("label").toString());
		
		for (ItemFacturaVO item : factura.getItems()) {
			if(item.getArticulo().getReferencia().equals(referencia)){
				Integer cantidad = Integer.valueOf(event.getNewValue().toString());
				if(item.getArticulo().getStock().compareTo(cantidad)>=0){					
					messagescantidadArticulo="";
				}else{
					cantidad=0;
					messagescantidadArticulo="No hay stock disponible.";
				}
				item.setCant(cantidad);
				break;
			}
		}
		calculateTotal();
		FacesContext.getCurrentInstance( ).renderResponse( );
	}
	public void selectCondicionPago(ValueChangeEvent event){
		System.out.println("Condicion de pago seleccionada"+event.getNewValue().toString());
		factura.setCondicionPago(event.getNewValue().toString());
	}
	public String getMessagescantidadArticulo() {
		return messagescantidadArticulo;
	}
	public void setMessagescantidadArticulo(String messagescantidadArticulo) {
		this.messagescantidadArticulo = messagescantidadArticulo;
	}
	public String getTipoFactura() {
		return tipoFactura;
	}
	public void setTipoFactura(String tipoFactura) {
		if(tipoFactura!=null){
			this.tipoFactura = tipoFactura;
		}
	}
	private void calculateTotal() {
		total=0D;
		if(factura!=null && factura.getItems()!=null){
        	for (ItemFacturaVO item : factura.getItems()) {
				total+=item.getPrecioCobrado()*item.getCant();
			}
        }
		subtotal = total;
		if(this.tipoFactura.equalsIgnoreCase("A")){
			subtotal = total/1.21F;        	
        }
        iva = total - subtotal;
	}


	public String generarFactura() {
		String salida="sucess";
		try {
			System.out.println("Iniciando la generacion de la factua");
			getBusineDelegate().generarFactura(factura);
			System.out.println("Finalizando la generacion de la factua");
		} catch (Exception e) {
			e.printStackTrace();
			salida="error";
		}
		return salida;
    }

	
	
	public Integer getArticuloReferencia() {
		return articuloReferencia;
	}
	public void setArticuloReferencia(Integer articuloReferencia) {
		this.articuloReferencia = articuloReferencia;
	}
	public void agregarArticulo(){
		if(articuloReferencia!=null){
			ItemFacturaVO itemArticulo = getBusineDelegate().getItemFacturaVO(articuloReferencia);
			if(itemArticulo!=null){
				if(itemArticulo.getArticulo().getStock()>0){
					addArticulo(itemArticulo);
				}else{
					messagesAgregarArticulo="No se pudo agregar el articulo de referencia "+articuloReferencia+" stock insuficiente";
				}				
			}else{
				messagesAgregarArticulo="No se pudo agregar el articulo de referencia "+articuloReferencia;
			}
		articuloReferencia=null;
		}else{
			messagesAgregarArticulo="la referencia debe tener un valor";
		}
	}
	private void addArticulo(ItemFacturaVO itemArticulo) {
		if(!factura.getItems().contains(itemArticulo)){
			itemArticulo.setFactura(factura);
			factura.getItems().add(itemArticulo);
			//Collections.sort(articulos);
			messagesAgregarArticulo="";
		}
	}

	public String getMessagesAgregarArticulo() {
		return messagesAgregarArticulo;
	}
	public void setMessagesAgregarArticulo(String messagesAgregarArticulo) {
		this.messagesAgregarArticulo = messagesAgregarArticulo;
	}
	public BusineDelegatePalc getBusineDelegate() {
		return busineDelegate;
	}
	public FacturaVO getFactura() {
		return factura;
	}
	public void setFactura(FacturaVO factura) {
		this.factura = factura;
	}
}
